import * as services from 'services/article';

export default {
  //建议最多一层嵌套，以保持 state 的扁平化，深层嵌套会让 reducer 很难写和难以维护。
  namespace: 'article',

  state: {
    list: [],
    detail: {},
  },
  // reducer 是一个函数，接受 state 和 action，返回老的或新的 state 。即：(state, action) => state
  reducers: {
    save(state, action) {
      return { ...state, ...action.payload };
    },
  },
  // yield put 用于触发 action
  // yield call 用于调用异步逻辑，支持 promises 
  // yield select 用于从state里获取数据
  effects: {
    *fetch({ payload }, { call, put }) {
      const list = yield call(services.queryArticleList);
      yield put({ type: 'save', payload: { list: list.data || [] } })

    },

    *query({ payload: id }, { call, put }) {
      const data = yield call(services.queryArticleDetail, id);
      yield put({ type: 'save', payload: { detail: data } });
    },
  },
  // subscriptions 是订阅，用于订阅一个数据源，然后根据需要 dispatch 相应的 action。
  // 数据源可以是当前的时间、服务器的 websocket 连接、keyboard 输入、geolocation 变化、history 路由变化等等。
  // 格式为 ({ dispatch, history }) => unsubscribe 。
  subscriptions: {
    setup({ dispatch, history }) {
      return history.listen(({ pathname, query }) => {
        if (/articles/.test(pathname)) {
          dispatch({ type: 'fetch' });
        }
      });
    },
  },
}
